
import java.util.Scanner;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Bruno
 */
public class HexConsole {
	private Scanner in = new Scanner(System.in);

	public void run() {
		menu();
	}

	private void menu() {
		String op = "";
		

		while(!op.equals("2")) {

			System.out.println("\n***************************\n"
							   + "***   _   _             ***\n"
							   + "***  | | | | _____  __  ***\n"
							   + "***  | |_| |/ _ \\ \\/ /  ***\n"
							   + "***  |  _  |  __/>  <   ***\n"
							   + "***  |_| |_|\\___/_/\\_\\  ***\n"
							   + "***                     ***\n"
							   + "***************************");
			System.out.println();
			System.out.println("1. Jogar\n"
					+ "2. Sair\n");
			
			boolean op_valida = false;
			while(!op_valida) {
				System.out.print("Opção: ");
				op = in.nextLine();
				if(op.equals("1") || op.equals("2"))
					op_valida = true;
				else
					System.out.println("Introduza uma opção válida!");
			}

			if(op.equals("1"))
				optionsSize();
		}
	}

	private void optionsSize() {
		String op;
		boolean op_valida = false;
		int num = 7;

		System.out.println("\nQuantas linhas e colunas terá o tabuleiro?\n"
				+ "(valor entre " + Board.MIN_SIZE + " e " + Board.MAX_SIZE + ")\n");

		while(!op_valida) {
			System.out.print("Nº de linhas/colunas: ");
			op = in.nextLine();
			try {
				num = Integer.parseInt(op);
				if(num < Board.MIN_SIZE || num > Board.MAX_SIZE)
					System.out.println("Valor não permitido! (min: " + Board.MIN_SIZE + ", max: " + Board.MAX_SIZE + ")");
				else
					op_valida = true;
			}
			catch(NumberFormatException ex) {
				System.out.println("Introduza um valor numérico!");
			}
		}

		Hex.board = new Board(num);
		optionsWhitePlayer();
	}

	private void optionsWhitePlayer() {
		String op = "";
		boolean op_valida = false;

		System.out.println("\nJogador branco, representado por O:\n"
				+ "(tem que fazer uma linha que conecte os lados esquerdo e direito do tabuleiro)\n"
				+ "1. Humano\n"
				+ "2. Computador fácil\n"
				+ "3. Computador médio\n"
				+ "4. Computador difícil\n");

		while(!op_valida) {
			System.out.print("Opção: ");
			op = in.nextLine();
			if(op.equals("1") || op.equals("2") || op.equals("3") || op.equals("4"))
				op_valida = true;
			else
				System.out.println("Introduza uma opção válida!");
		}

		if(op.equals("1"))
			Hex.whitePlayer = Player.HUMAN;
		else if(op.equals("2"))
			Hex.whitePlayer = Player.CPU_EASY;
		else if(op.equals("3"))
			Hex.whitePlayer = Player.CPU_MEDIUM;
		else if(op.equals("4"))
			Hex.whitePlayer = Player.CPU_HARD;

		optionsBlackPlayer();
	}

	private void optionsBlackPlayer() {
		String op = "";
		boolean op_valida = false;

		System.out.println("\nJogador preto, representado por X:\n"
				+ "(tem que fazer uma linha que conecte os lados superior e inferior do tabuleiro)\n"
				+ "1. Humano\n"
				+ "2. Computador fácil\n"
				+ "3. Computador médio\n"
				+ "4. Computador difícil\n");

		while(!op_valida) {
			System.out.print("Opção: ");
			op = in.nextLine();
			if(op.equals("1") || op.equals("2") || op.equals("3") || op.equals("4"))
				op_valida = true;
			else
				System.out.println("Introduza uma opção válida!");
		}

		if(op.equals("1"))
			Hex.blackPlayer = Player.HUMAN;
		else if(op.equals("2"))
			Hex.blackPlayer = Player.CPU_EASY;
		else if(op.equals("3"))
			Hex.blackPlayer = Player.CPU_MEDIUM;
		else if(op.equals("4"))
			Hex.blackPlayer = Player.CPU_HARD;

		// Escolher o jogador que inicia o jogo
		int player = (int)(Math.random() * 2.0);
		if(player == 0) {
			Hex.currentPlayer = Color.WHITE;
			System.out.println("\nO primeiro a jogar é o jogador branco!");
		}
		else {
			Hex.currentPlayer = Color.BLACK;
			System.out.println("\nO primeiro a jogar é o jogador preto!");
		}

		play();
	}

	private void play() {
		while(!Hex.board.isGameOver()) {
			// Início de um turno
			Hex.board.drawBoard();
			if(Hex.currentPlayer == Color.WHITE)
				System.out.println("Vez do jogador branco.");
			else
				System.out.println("Vez do jogador preto.");

			Move move = getMove();
			Hex.board.placePiece(Hex.currentPlayer, move);
			char line = Board.posNumberToLetter(move.getLine());
			char col = Board.posNumberToLetter(move.getColumn());
			if(Hex.currentPlayer == Color.WHITE)
				System.out.println("O jogador branco colocou uma peça na linha " + line + ", coluna " + col + ".");
			else
				System.out.println("O jogador preto colocou uma peça na linha " + line + ", coluna " + col + ".");

			Hex.changeTurn();
		}

		// Game over, verificar e mostrar vencedor
		Hex.board.drawBoard();
		System.out.println("\nFim do Jogo");
		if(Hex.board.getWinner() == Color.WHITE)
			System.out.println("Vitória do jogador branco!");
		else
			System.out.println("Vitória do jogador preto!");

		System.out.println("\nPrima <Enter> para voltar ao menu...");
		in.nextLine();
	}

	private Move getMove() {
		int playerType;
		if(Hex.currentPlayer == Color.WHITE)
			playerType = Hex.whitePlayer;
		else
			playerType = Hex.blackPlayer;

		if(playerType == Player.HUMAN) { // Jogada de um humano
			String res;
			boolean op_valida = false;
			Move move = null;
			while(!op_valida) {
				System.out.print("Indique a jogada (sob a forma \"linha,coluna\"): ");
				// Na verdade só são vistos o 1º e último caracteres
				res = in.nextLine();
				if(res.length() >= 2) {
					res = res.toUpperCase();
					int line = Board.posLetterToNumber(res.charAt(0));
					int col = Board.posLetterToNumber(res.charAt(res.length() - 1));
					move = new Move(line, col);
					if(Hex.board.isValidMove(move))
						op_valida = true;
					else
						System.out.println("Jogada inválida!");
				}
			}
			return move;
		}
		else // Jogada do computador
			return ComputerAI.makeMove(Hex.board, Hex.currentPlayer, playerType);
	}
}
